package ocg.common.re.read;


import ocg.common.re.value.ObjectValue;
import ocg.common.re.value.ValueFactory;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.*;
import java.lang.reflect.Field;
import java.util.Properties;

/**
 * 读取 Properties 文件， 一个 Properties 对应一个 实体类
 */
public class PropertiesAssign {

    static Logger logger = LogManager.getLogger ( PropertiesAssign.class );

    /**
     * 读取 Properties
     * @param className
     */
    public static void getPropertiesValue( Class<?> className ){

//        getSimpleName() 获取类名（ConfingTest）
//        StringBuffer : 字符串拼接 获取文件名
        String fileName = new StringBuffer().append("properties").append( File.separator ).append( className.getSimpleName() ).append( ".properties" ).toString();

        logger.info ( "读取文件：" + fileName );

        InputStream inputStream = PropertiesAssign.class.getClassLoader().getResourceAsStream( fileName );

        if ( inputStream == null ){
            logger.error ( "文件未找到：" + fileName );
        }

        Properties properties = new Properties();

        try {

            if (inputStream != null) {
                Reader reader = new InputStreamReader ( inputStream );
                properties.load ( reader );

//            获取类对象
                Class clzss = Class.forName ( className.getName () );

//            getFields()：获得某个类的所有的公共（public）的字段，包括父类中的字段。
//            getDeclaredFields()：获得某个类的所有声明的字段，即包括public、private和proteced，但是不包括父类的申明字段。

                Field field[] = clzss.getDeclaredFields ();

                Object o = clzss.newInstance ();
                for (Field f : field) {

                    ObjectValue configValue = ValueFactory.getValues ( f.getType () );
                    Object object = properties.get ( f.getName () );
//                    logger.info ( "当前欲赋值 ：" + f.getName () + " value :" + object);
                    Object value = configValue.getValue ( object );

                    f.setAccessible ( true );
                    try {
                        f.set ( o, value );
                    } catch (IllegalAccessException e) {
                        e.printStackTrace ();
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace ();
        } catch (InstantiationException e) {
            e.printStackTrace ();
        }
    }
}
